package cn.tedu.cqhotel.service.impl;

import cn.tedu.cqhotel.ex.ServiceCode;
import cn.tedu.cqhotel.ex.ServiceException;
import cn.tedu.cqhotel.mapper.RoomMapper;
import cn.tedu.cqhotel.pojo.dto.RoomAddNewDTO;
import cn.tedu.cqhotel.pojo.dto.RoomUpdateDTO;
import cn.tedu.cqhotel.pojo.entity.Room;
import cn.tedu.cqhotel.pojo.vo.RoomListItemVO;
import cn.tedu.cqhotel.pojo.vo.RoomStandardVO;
import cn.tedu.cqhotel.service.IRoomService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.List;

/**
 * 处理房间业务的实现类
 * @author zhouyucheng
 */
@Slf4j
@Service
public class RoomServiceImpl implements IRoomService {

    @Autowired
    private RoomMapper roomMapper;

    /**
     * 添加房间信息
     * @param roomAddNewDTO 封装的房间信息对象
     */
    @Override
    public void addNew(RoomAddNewDTO roomAddNewDTO) {
        log.debug("开始处理[添加房间信息]的业务...参数{}",roomAddNewDTO);
        //检查房间是否已经存在
        RoomStandardVO standardByRoomId = roomMapper.getStandardByRoomId(roomAddNewDTO.getRoomId());
        if (standardByRoomId!=null){
            String message = "添加房间信息失败,房间编号["+roomAddNewDTO.getRoomId()+"]已经存在";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT,message);
        }

        //创建房间对象,插入数据表
        Room room = new Room();
        BeanUtils.copyProperties(roomAddNewDTO,room);
        //插入数据
        log.debug("开始向数据库总插入数据:{}",room);
        int rows = roomMapper.insert(room);
        if (rows != 1) {
            String message = "添加房间失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_INSERT, message);
        }

    }

    /**
     * 根据房间id删除房间信息
     * @param roomId 房间id
     */
    @Override
    public void deleteByRoomId(Integer roomId) {
        log.debug("开始处理[根据房间id删除房间信息]的业务...");
        // 调用Mapper对象的getStandardById()方法执行查询
        RoomStandardVO standardByRoomId = roomMapper.getStandardByRoomId(roomId);
        // 判断查询结果是否为null
        if (standardByRoomId == null) {
            // 是：此id对应的数据不存在，则抛出异常(ERR_NOT_FOUND)
            String message = "删除房间失败，尝试删除的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        // 调用Mapper对象的deleteByRoomId()执行删除，并获取返回值
        int rows = roomMapper.deleteByRoomId(roomId);
        // 判断以上返回值是否不为1
        if (rows != 1) {
            // 是：抛出异常(ERR_DELETE)
            String message = "删除房间失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_DELETE, message);
        }
    }

    /**
     * 根据房间id修改房间信息
     * @param roomUpdateDTO 封装了要修改的房间id,及要修改字段的值
     */
    @Override
    public void updateByRoomId(Integer roomId,RoomUpdateDTO roomUpdateDTO) {
        log.debug("开始处理[根据房间id修改房间信息]的业务.id:{},roomUpdateDTO:{}",roomId,roomUpdateDTO);
        // 调用Mapper对象的getStandardById()方法执行查询
        RoomStandardVO standardByRoomId = roomMapper.getStandardByRoomId(roomId);
        // 判断查询结果是否为null
        if (standardByRoomId == null) {
            // 是：此id对应的数据不存在，则抛出异常(ERR_NOT_FOUND)
            String message = "修改房间详情失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        Room room = new Room();
        BeanUtils.copyProperties(roomUpdateDTO,room);
        room.setRoomId(roomId);

        // 修改数据
        log.debug("即将修改数据：{}", room);
        int rows = roomMapper.updateByRoomId(room);
        if (rows != 1) {
            String message = "修改房间详情失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE, message);
        }
    }

    /**
     * 根据房间编号获取房间详情
     * @param roomId 房间编号
     * @return
     */
    @Override
    public RoomStandardVO getStandardByRoomId(Integer roomId) {
        log.debug("开始处理【根据房间编号获取房间详情】的业务,roomId:{}",roomId);
        // 调用Mapper对象的getStandardById()方法执行查询
        RoomStandardVO standardByRoomId = roomMapper.getStandardByRoomId(roomId);
        if (standardByRoomId == null) {
            // 是：此id对应的数据不存在，则抛出异常(ERR_NOT_FOUND)
            String message = "获取房间详情失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        return standardByRoomId;
    }

    /**
     * 查询房间列表
     * @return
     */
    @Override
    public List<RoomListItemVO> list() {
        log.debug("开始处理【查询房间列表】的业务");
        return roomMapper.list();
    }

    /**
     * 根据房间是否入住查询房间信息列表
     * @param isUsed 是否入住的字段值
     * @return
     */
    @Override
    public List<RoomListItemVO> listByIsUsed(Integer isUsed) {
        log.debug("开始处理[根据房间是否入住查询房间信息列表]的业务,isUsed:{}",isUsed);
        List<RoomListItemVO> listByIsUsed = roomMapper.listByIsUsed(isUsed);
        if (listByIsUsed.size()<1) {
            // 是：此id对应的数据不存在，则抛出异常(ERR_NOT_FOUND)
            String message = "获取房间列表失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        return listByIsUsed;
    }

    /**
     * 根据房间可住人数类型和房间类型查询房间信息列表
     * @param version 房间可住人数类型,房间类型
     * @param type
     * @return
     */
    @Override
    public List<RoomListItemVO> listByVersionAndType(Integer version, Integer type) {
        log.debug("开始处理[根据房间可住人数类型和房间类型查询房间信息列表]的业务,version:{},type:{}",version,type);
        List<RoomListItemVO> listByVersionAndType = roomMapper.listByVersionAndType(version, type);
        if (listByVersionAndType.size()<1) {
            // 是：此id对应的数据不存在，则抛出异常(ERR_NOT_FOUND)
            String message = "获取房间列表失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        return listByVersionAndType;
    }

    /**
     * 根据房间单价查询房间信息列表
     * @param price 房间单价
     * @return
     */
    @Override
    public List<RoomListItemVO> listByPrice(BigDecimal price) {
        log.debug("开始处理[根据房间单价查询房间信息列表]的业务,price:{}",price);
        List<RoomListItemVO> listByPrice = roomMapper.listByPrice(price);
        if (listByPrice.size()<1) {
            // 是：此id对应的数据不存在，则抛出异常(ERR_NOT_FOUND)
            String message = "获取房间列表失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        return listByPrice;
    }


}
